home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / tex / tools / dvi / starjet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  4.5 KB  |  195 lines

  1. /*
  2.  * Hier der speziell an den StarJet SJ-48 von Star angepasste ****
  3.  * 48-Duesentreiber.
  4.  *
  5.  * Anpassung von Roland Dieterich
  6.  *  FidoClassic:  2:2456/50.42
  7.  *       Z-Netz:  R.DIETERICH@LINK-AK.ZER
  8.  *     Internet:  Roland.Dieterich@p42.f50.n2456.z2.schiele-ct.de
  9.  */
  10. #include <portab.h>
  11.  
  12. #include "mintbind.h"
  13. #include "treiber.h"
  14.  
  15. /** Vorlaeufige Parameter */
  16. #define MAX_DPI 360L
  17. #define WEITE   2880L
  18. #define HOEHE   -1L
  19. #define OBEN    0L
  20. #define LINKS   0L
  21.  
  22. #ifdef FAST_PRN
  23. #define WRITE(i,j) ((th>0)?(Fwrite(th,i,j)):(print_block(i,j)))
  24. #endif
  25.  
  26.  
  27. /* Reset + NLQ + Einheit 1/MAX_DPI" */
  28. UBYTE   *INIT   =   "\033@\033x\001\033+\001";
  29. UBYTE   *H_STEP =   "\033\\xx";
  30. UBYTE   *V_STEP =   "\033Jx\012";
  31.  
  32.  
  33. struct
  34. {
  35.     UBYTE   modus;
  36.     WORD    h_dpi;
  37.     WORD    v_dpi;
  38.     WORD    t;
  39. } modus[4]=
  40. {
  41.     { 39, 180, 180, 3 },
  42.     { 40, 360, 180, 3 },
  43.     { 71, 180, 360, 6 },
  44.     { 72, 360, 360, 6 }
  45. };
  46.  
  47. /* Zwischenspeicher fuer eine Zeile */
  48. static UBYTE    tmp[WEITE*6L+5L];
  49.  
  50.  
  51. WORD drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
  52. {
  53.     extern char tmp_file[256]; /* In Datei drucken? */
  54.     extern long max_puffer_laenge;
  55.  
  56.     LONG    max_spalte, zeile, lz, links, linker_rand, rechts;
  57.     LONG    len, i, d_modus, bits_per_row;
  58.     WORD    th=0;
  59.  
  60. #ifdef FAST_PRN
  61.     /* Fuer viel Geschwindigkeit = sinnvoll grosser Puffer */
  62.     max_puffer_laenge = WEITE*6L+256L;
  63.     if(  tmp_file[0]>0  ||  open_printer()<0  )
  64. #endif
  65.         th = (WORD)get_tempfile( "sj" );
  66.     if(  th<0  )
  67.         return -1;
  68.  
  69.     if(  v_dpi<200  )
  70.         v_dpi = 180;
  71.     else
  72.         v_dpi = MAX_DPI;
  73.  
  74.     for(d_modus=0; d_modus<3; d_modus++)
  75.     if( (h_dpi*90)/100<modus[d_modus].h_dpi && v_dpi==modus[d_modus].v_dpi  )
  76.             break;
  77.     h_dpi = modus[d_modus].h_dpi;
  78.     bits_per_row = 8*modus[d_modus].t;
  79.     d_modus = modus[d_modus].modus;
  80.  
  81.         /* Ab hier wird es ernst */
  82.     if(  weite<(WEITE*h_dpi)/360L  )
  83.         max_spalte = (weite+7)/8;
  84.     else
  85.         max_spalte = (WEITE*h_dpi)/(MAX_DPI*8L);
  86.  
  87.         /* Diverse Variablen initialisieren */
  88.     zeile = 0;
  89.     weite = (weite+15L)/16L;
  90.     weite *= 2;
  91.     p += weite*OBEN + LINKS;    /* Nicht druckbare Raender*/
  92.     max_zeile -= OBEN;
  93.     if(  HOEHE>0    &&  (max_zeile*v_dpi)/MAX_DPI>HOEHE  )
  94.         max_zeile = HOEHE;
  95.  
  96. for(  linker_rand=0;ist_next_leer( p+linker_rand, weite, max_zeile )  &&
  97.       linker_rand<max_spalte;  linker_rand++  )
  98.         ;
  99.     if(  linker_rand==max_spalte  )
  100.     {   /* Leerseite */
  101.         WRITE( 1L, "\014" );
  102.         return th;
  103.     }
  104.  
  105.         /* Reset + LQ-Mode */
  106.     WRITE( 8L, INIT );
  107.  
  108.     /* Endlich drucken */
  109.     lz = 0;
  110.     max_zeile--;
  111.     while(  zeile<max_zeile )
  112.     {
  113.         /* Leerzeilen ueberspringen */
  114.         while(  zeile<max_zeile  &&  ist_leerzeile( p, max_spalte )  )
  115.         {
  116.             lz++;
  117.             zeile++;
  118.             p += weite;
  119.         }
  120.  
  121.         if(  zeile>=max_zeile  )
  122.         {
  123.             lz = lz+(max_zeile-zeile)-bits_per_row;
  124.             if(  lz>0  )
  125.                 break;
  126.         }
  127.  
  128.         /* Leerzeilen ueberspringen */
  129.         if(  v_dpi==360  )
  130.         {
  131.             if(  lz&1  )
  132.                 WRITE( 1L, "\012" );
  133.             lz >>= 1;
  134.         }
  135.  
  136.         while(  lz>0    )
  137.         {
  138.             if(  lz>255  )
  139.                 V_STEP[2] = 255;
  140.             else
  141.                 V_STEP[2] = (UBYTE)lz;
  142.             WRITE( 4L, V_STEP );
  143.             lz -= 255;
  144.         }
  145.  
  146.             /* Raender feststellen */
  147. for(rechts=max_spalte-1;ist_next_leer( p+rechts, weite, bits_per_row )&&
  148.     rechts>linker_rand;  rechts--  )
  149.             ;
  150.         rechts++;
  151. for(  links=linker_rand;ist_next_leer( p+links, weite, bits_per_row )&&
  152.     links<rechts;  links++  )
  153.             ;
  154.  
  155.         if( links>0 )
  156.         {   /* Linker Rand */
  157.             if( h_dpi == MAX_DPI )
  158.                 i = links*4L;
  159.             else
  160.                 i = links*8L;
  161.             H_STEP[2] = (UBYTE)(i%256);
  162.             H_STEP[3] = (UBYTE)(i/256);
  163.             WRITE( 4L, H_STEP );
  164.         }
  165.  
  166.         len = rechts-links;
  167.         tmp[0] = '\033';
  168.         tmp[1] = '*';
  169.         tmp[2] = (UBYTE)d_modus;
  170.         tmp[3] = (UBYTE)((len%32)*8);
  171.         tmp[4] = (UBYTE)(len>>5);
  172.  
  173.         block_it( tmp+5, p+links, len, weite, bits_per_row/8 );
  174.         WRITE( 5L+len*bits_per_row, tmp );
  175.         p += weite*bits_per_row;
  176.         zeile += bits_per_row;
  177.         lz = bits_per_row;
  178.  }
  179.  
  180.         /* Ende Seite */
  181.     if(  1!=WRITE( 1L, "\014" )  )
  182.     {
  183.         /* Platz reichte nicht aus */
  184.         if(  th>0  )
  185.             Fclose( th );
  186.         th = -1;
  187.     }
  188.  
  189.     if(  tmp_file[0]==0  )
  190.         flush_block();
  191.     return th;
  192. }
  193. /* 22.2.94 */
  194.  
  195.